package ar.com.grupo1.ler.dominio;

import java.math.BigDecimal;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;

import ar.com.grupo1.ler.exceptions.BusinessException;
import ar.com.grupo1.ler.exceptions.ValoresInvalidosException;

public class Camioneta extends Vehiculo {

	private static Logger logger = Logger.getLogger(Camioneta.class);

	public static final long CARGA_MAXIMA = 2500;
	public static final long LIMITE_KG_PARA_VIAJES = 1800;
	public static final long LIMITE_KG_PARA_CONSUMO = 1500;
	public static final long FACTOR_HASTA_1800_KG = 100;
	public static final long FACTOR_DESDE_1800_KG = 90;
	public static final BigDecimal FACTOR_LITROS_X_KM_HASTA_1500_KG = new BigDecimal("0.15");
	public static final BigDecimal FACTOR_LITROS_X_KM_DESDE_1500_KG = new BigDecimal("0.2");

	public Camioneta() {
		super();
	}

	public Camioneta(Conductor conductor, Long litrosEnTanque) {
		setConductor(conductor);
		setLitrosEnTanque(litrosEnTanque);
	}

	@Override
	public Long getCargaMaxima() {
		return CARGA_MAXIMA;
	}

	@Override
	public BigDecimal getTiempoViaje(Viaje viaje) throws ValoresInvalidosException {
		if (viaje == null) {
			throw new BusinessException("Viaje Nulo. No se puede calcular el tiempo de viaje sin un viaje");
		}
		viaje.verificarViaje();
		Long cantKg = viaje.getCarga();
		BigDecimal cantKm = viaje.getRuta().getCantTotalKm();
		BigDecimal tiempoViaje = null;
		Long factorADividir = null;

		if (cantKg <= LIMITE_KG_PARA_VIAJES) {
			factorADividir = FACTOR_HASTA_1800_KG;
		} else if (cantKg > LIMITE_KG_PARA_VIAJES) {
			factorADividir = FACTOR_DESDE_1800_KG;
		}

		tiempoViaje = cantKm.divide(new BigDecimal(factorADividir.toString()), 2, BigDecimal.ROUND_HALF_EVEN);

		logger.debug("Tiempo: Se divide la cantidad de Km's del viaje [" + cantKm + "] por el factor [" + factorADividir
				+ "], porque la cantidad de Kg's a transportar son [" + cantKg + "]");
		return tiempoViaje;
	}

	@Override
	public BigDecimal getConsumoCombustible(Viaje viaje) throws ValoresInvalidosException {
		if (viaje == null) {
			throw new BusinessException("Viaje Nulo. No se puede calcular el consumo del combustible sin un viaje");
		}
		viaje.verificarViaje();
		Long cantKg = viaje.getCarga();
		BigDecimal cantKm = viaje.getRuta().getCantTotalKm();
		BigDecimal consumoCombustible = null;
		BigDecimal factorAMultiplicar = null;
		if (cantKg <= LIMITE_KG_PARA_CONSUMO) {
			factorAMultiplicar = FACTOR_LITROS_X_KM_HASTA_1500_KG;
		} else if (cantKg > LIMITE_KG_PARA_CONSUMO) {
			factorAMultiplicar = FACTOR_LITROS_X_KM_DESDE_1500_KG;
		}
		consumoCombustible = factorAMultiplicar.multiply(new BigDecimal(cantKm.toString()));
		logger.debug("Consumo [" + consumoCombustible + "]: Se multiplica la cantidad de Km's del viaje [" + cantKm
				+ "] por el factor [" + factorAMultiplicar + "], porque la cantidad de Kg's a transportar son [" + cantKg + "]");

		return consumoCombustible;
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
}
